package com.bi.service;

import com.bi.common.PageResult;
import com.bi.dto.CreateWideTableDTO;
import com.bi.dto.WideTableDataQueryDTO;
import com.bi.dto.WideTableQueryDTO;
import com.bi.entity.WideTable;
import com.bi.vo.WideTableDataVO;
import com.bi.vo.WideTableFieldVO;
import com.bi.vo.WideTableVO;

import java.util.List;
import java.util.Map;

/**
 * 数据宽表服务接口
 * 
 * @author BI Platform Team
 * @since 1.0.0
 */
public interface WideTableService {

    /**
     * 创建数据宽表
     * 
     * @param createDTO 创建DTO
     * @param creator 创建人
     * @return 宽表ID
     */
    Long createWideTable(CreateWideTableDTO createDTO, String creator);

    /**
     * 更新数据宽表
     * 
     * @param id 宽表ID
     * @param createDTO 更新DTO
     * @param operator 操作人
     * @return 更新结果
     */
    boolean updateWideTable(Long id, CreateWideTableDTO createDTO, String operator);

    /**
     * 删除数据宽表
     * 
     * @param id 宽表ID
     * @param operator 操作人
     * @return 删除结果
     */
    boolean deleteWideTable(Long id, String operator);

    /**
     * 根据ID查询数据宽表详情
     * 
     * @param id 宽表ID
     * @return 宽表详情
     */
    WideTableVO getWideTableById(Long id);

    /**
     * 分页查询数据宽表
     * 
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    PageResult<WideTableVO> getWideTablePage(WideTableQueryDTO queryDTO);

    /**
     * 查询用户可访问的数据宽表列表
     * 
     * @param creator 创建人
     * @return 宽表列表
     */
    List<WideTableVO> getAccessibleWideTableList(String creator);

    /**
     * 根据宽表ID查询字段列表
     * 
     * @param wideTableId 宽表ID
     * @return 字段列表
     */
    List<WideTableFieldVO> getWideTableFields(Long wideTableId);

    /**
     * 更新宽表字段配置
     * 
     * @param wideTableId 宽表ID
     * @param fields 字段列表
     * @param operator 操作人
     * @return 更新结果
     */
    boolean updateWideTableFields(Long wideTableId, List<CreateWideTableDTO.WideTableFieldDTO> fields, String operator);

    /**
     * 初始化在线数据宽表索引
     * 
     * @param wideTableId 宽表ID
     * @return 初始化结果
     */
    boolean initOnlineWideTableIndex(Long wideTableId);

    /**
     * 查询宽表数据
     * 
     * @param queryDTO 查询条件
     * @return 查询结果
     */
    WideTableDataVO queryWideTableData(WideTableDataQueryDTO queryDTO);

    /**
     * 聚合查询宽表数据
     * 
     * @param queryDTO 查询条件
     * @return 聚合结果
     */
    Map<String, Object> aggregateWideTableData(WideTableDataQueryDTO queryDTO);

    /**
     * 导出宽表数据
     * 
     * @param queryDTO 查询条件
     * @return 导出文件路径
     */
    String exportWideTableData(WideTableDataQueryDTO queryDTO);

    /**
     * 获取宽表字段统计信息
     * 
     * @param wideTableId 宽表ID
     * @param fieldName 字段名称
     * @return 统计信息
     */
    WideTableDataVO.FieldStats getFieldStats(Long wideTableId, String fieldName);

    /**
     * 检查宽表名称是否可用
     * 
     * @param name 宽表名称
     * @param excludeId 排除的ID
     * @return 是否可用
     */
    boolean isWideTableNameAvailable(String name, Long excludeId);

    /**
     * 激活/停用数据宽表
     * 
     * @param id 宽表ID
     * @param status 状态
     * @param operator 操作人
     * @return 操作结果
     */
    boolean updateWideTableStatus(Long id, WideTable.WideTableStatus status, String operator);

    /**
     * 同步宽表结构到Elasticsearch
     * 
     * @param wideTableId 宽表ID
     * @return 同步结果
     */
    boolean syncWideTableToEs(Long wideTableId);

    /**
     * 获取宽表数据总数
     * 
     * @param wideTableId 宽表ID
     * @return 数据总数
     */
    long getWideTableDataCount(Long wideTableId);

    /**
     * 清空宽表数据
     * 
     * @param wideTableId 宽表ID
     * @param operator 操作人
     * @return 清空结果
     */
    boolean clearWideTableData(Long wideTableId, String operator);
}